//////////////////////////////////////////////////////////////////////
//
// NO_Constructor.cpp: implementation of the NO_Constructor class.
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#define NO_TAL_EXPORT

//////////////////////////////////////////////////////////////////////////
#include "NO_Externs.h"
#include "NO_Constructor.h"
#include "NO_TypeID.h"
#include "NO_TypeList.h"

//////////////////////////////////////////////////////////////////////////
// copy
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_Value* NO_NoneCopy::getCopyImpl (NO_Value&) const {return 0;}

//////////////////////////////////////////////////////////////////////////
// NO_IConstructor
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_IConstructor::NO_IConstructor():next(0){};
NO_IConstructor::~NO_IConstructor(){};

//////////////////////////////////////////////////////////////////////////
NO_UInt32 NO_IConstructor::getID(void) const{return id;}

//////////////////////////////////////////////////////////////////////////
// NO_ConstructorFriend
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
void				NO_ConstructorFriend::setID		(NO_IConstructor* c, NO_UInt32 id)			const {c->id = id;}
NO_IConstructor*	NO_ConstructorFriend::getNext	(const NO_IConstructor* c)					const {return c->next;}
void				NO_ConstructorFriend::setNext	(NO_IConstructor* c, NO_IConstructor* n)	const {c->next = n;}

//////////////////////////////////////////////////////////////////////////
// class NO_ConstructorList definition
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
NO_ConstructorList::NO_ConstructorList(void):first(0),last(0){}

//////////////////////////////////////////////////////////////////////
NO_ConstructorList::~NO_ConstructorList(void)
{
	const NO_IConstructor * iter = first;
	const NO_IConstructor * kill = 0;
	while(iter)
	{
		kill = iter;
		iter = getNext(iter);
		delete kill;
	}
}

//////////////////////////////////////////////////////////////////////////
// modify
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_Boolean NO_ConstructorList::addConstructor(NO_IConstructor* obj)
{
	NO_TypeList parameter;
	obj->getParameter(parameter);
	
	NO_UInt32 hash = parameter.getID();	
	setID(obj, hash);
	if(!first){first = obj;}
	if(last){setNext(last,obj);}
	last = obj;
	return 1;
}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
const NO_IConstructor* NO_ConstructorList::findConstructorImpl(NO_UInt32 ID) const 
{
	const NO_IConstructor * iter = first;
	while(iter)
	{
		if (iter->getID()==ID){return iter;}
		iter = getNext(iter);
	}
	return 0;
}

//////////////////////////////////////////////////////////////////////////
const NO_IConstructor* NO_ConstructorList::findConstructorImpl(const NO_TypeList& list) const
{
	NO_UInt32 hash = list.getID();	
	return findConstructorImpl(hash);
}

//////////////////////////////////////////////////////////////////////////
const NO_IConstructor* NO_ConstructorList::beginConstructorImpl(void)						const {return first;}
const NO_IConstructor* NO_ConstructorList::endConstructorImpl	(void)						const {return 0;}
const NO_IConstructor* NO_ConstructorList::nextConstructorImpl(const NO_IConstructor* i)	const {return getNext(i);}

//////////////////////////////////////////////////////////////////////////
// class NO_ConstructorList definition
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
NO_SingleConstructor::NO_SingleConstructor(void):constructor(0){}
NO_SingleConstructor::~NO_SingleConstructor(void){if(constructor){delete constructor;}}

//////////////////////////////////////////////////////////////////////////
// modify
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_Boolean NO_SingleConstructor::addConstructor(NO_IConstructor* obj)
{
	if(constructor){delete constructor;}
	constructor = obj;
	return 1;
}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
const NO_IConstructor* NO_SingleConstructor::findConstructorImpl(const NO_TypeList&)const {return constructor;}
const NO_IConstructor* NO_SingleConstructor::findConstructorImpl(NO_UInt32 ID)		const {return constructor;}

//////////////////////////////////////////////////////////////////////////
const NO_IConstructor* NO_SingleConstructor::beginConstructorImpl(void)						const {return constructor;}
const NO_IConstructor* NO_SingleConstructor::endConstructorImpl	(void)						const {return 0;}
const NO_IConstructor* NO_SingleConstructor::nextConstructorImpl(const NO_IConstructor* i)	const {return 0;}

//////////////////////////////////////////////////////////////////////////
// class NO_ConstructorList definition
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
NO_NoneConstructors::NO_NoneConstructors(void)	{}
NO_NoneConstructors::~NO_NoneConstructors(void)	{}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
const NO_IConstructor* NO_NoneConstructors::findConstructorImpl(const NO_TypeList&)	const {return 0;}
const NO_IConstructor* NO_NoneConstructors::findConstructorImpl(NO_UInt32 ID)		const {return 0;}

//////////////////////////////////////////////////////////////////////////
const NO_IConstructor* NO_NoneConstructors::beginConstructorImpl(void)						const {return 0;}
const NO_IConstructor* NO_NoneConstructors::endConstructorImpl	(void)						const {return 0;}
const NO_IConstructor* NO_NoneConstructors::nextConstructorImpl	(const NO_IConstructor*& i)	const {return 0;}

